스트림 생성
✒️ 2025-05-15 10:50 내용 수정
참고 자료 : TCPSchool 스트림의 생성
- 사용할 수 있는 데이터 소스 : 컬렉션, 배열, 가변 매개변수, 지정된 범위의 연속된 정수, 특정 타입의 난수들, 람다 표현식, 파일, 빈 스트림
- 생성 방법은 크게 기존 클래스에 정의된
stream()메서드들 사용하거나, Stream에 정의된 메서드를 사용하여 Stream에 요소를 추가하는 것이 있다.
1. 컬렉션
Stream<T> 스트림이름 = 컬렉션인스턴스.stream();
- Collection 인터페이스에는 stream() 메서드가 정의되어 있음
ArrayList<Integer> list = new ArrayList<Integer>();
Stream<Integer> stream = list.stream();
2. 배열
Stream<T> 스트림이름 = Array.stream(배열인스턴스);
IntStream 스트림이름 = Array.stream(배열인스턴스);
- Arrays 클래스에 stream() 메서드가 클래스 메서드로 정의되어 있음
- IntStream, LongStream, DoubleStream 인터페이스에서 기본 타입을 저장할 수 있는 배열 스트림이 별도로 정의되어 있다.
String[] arr = new String[];
Stream<String> stream = Arrays.stream(arr);
Integer[] intArr = new Integer[];
IntStream intStream = Arrays.stream(intArr);
3. 가변 매개변수
Stream<T> 스트림이름 = Stream.of(가변매개변수);
- Stream 클래스의 of() 메서드를 사용하면 가변 매개변수를 전달받아 스트림 생성 가능
Stream<Double> stream = Stream.of(4.2, 8.3, 1.9, 5.2);
4. 지정된 범위의 연속된 정수
IntStream 스트림이름 = IntStream.range(int 시작, int 끝);
IntStream 스트림이름 = IntStream.rangeClosed((int 시작, int 끝);
- IntStream이나 LongStream 인터페이스의 range()와 rangeClosed() 메서드 사용
range(): 명시된 시작 정수를 포함, 명시된 마지막 정수는 포함하지 않는 스트림 생성rangeClosee(): 명시된 시작 정수와 마지막 정수를 포함하는 스트림 생성
IntStream stream1 = IntStream.range(1, 4); // 1, 2, 3
IntStream stream2 = IntStream.rangeClose(1, 4); // 1, 2, 3, 4
5. 특정 타입의 난수들
IntStream 스트림이름 = new Random().ints(long 크기);
- Random 클래스의
ints(),longs(),doubles()메서드를 사용- 이 메서드들은 매개변수로 스트림의 크기를 long 타입으로 전달 받을 수 있다.
- 만약 매개변수로 크기를 전달 받지 않으면 무한 스트림을 반환하므로
limit()메서드로 크기 제한을 해야 한다.
IntStream stream = new Random().ints(4); // 크기가 4인 스트림 생성
6. 람다 표현식
Stream<T> 스트림이름 = Stream.iterate(시드, 람다식);
Stream<T> 스트림이름 = Stream.generate(람다식);
- Stream 클래스와 IntStream의
iterate()와generate()메서드를 사용iterate(): 시드로 명시된 값을 람다 표현식에서 사용하여 반환된 값을 다시 시드로 사용하는 무한 스트림을 생성Stream.iterate(초기값, 조건, 규칙)을 동시에 넣어서 생성할 수도 있다.- 조건에 들어가는 값은 final, effective final만 가능하다.
- Stream과 IntStream에서 iterate의 마지막 값 처리 방식이 달라 조건을 잘 확인해야 한다.
generate(): 매개 변수가 없는 람다 표현식을 사용하여 반환된 값으로 무한 스트림 생성- 프로그래머즈 예제에서 이를 사용한 풀이를 자주 봤다.
// 두 경우 모두 무한 스트림을 생성하기 때문에 limit()으로 크기를 제한해야 함
Stream<Integer> stream1 = Stream.iterate(2, n -> n+2).limit(3); // 2, 4, 6
Stream<Integer> st - Stream.iterate(0, i -> i < 10, i -> i+1); // 초기값, 조건, 규칙
Stream<String> stream2 = Stream.generate(() -> "gen").limit(4); // gen, gen, gen
7. 파일
Stream<T> 스트림이름 = Files.lines(Path path);
BufferedReader 스트림이름 = Files.line(Path path);
- Files 클래스의
lines()메서드를 사용, BufferedReader 클래스의line()메서드를 사용하면 파일 뿐만 아니라 다른 입력으로부터도 데이터를 행 단위로 읽어올 수 있음
Stream<String> stream = Files.lines(Path path);
8. 빈 스트림
Stream<T> 스트림이름 = Stream.empty();
- Stream 클래스의
empty()메서드 사용
Stream<Object> stream = Stream.empty();
9. 직접 추가해서 만들기
Stream<T> 스트림이름 = Stream.<T>builder().add().add()...build();
- Stream 클래스의
builder(),add(),build()메서드 사용
Stream<String> builderStream = Stream.<String>builder().add("a").add("b").build();
10. 문자열 스트림
IntStream 스트림이름 = "문자열내용".chars();
- String의 각 문자 char를 IntStream으로 변환할 수 있다.
IntStream stream = "Stream".chars();